https://www.mumble.net/~jar/articles/oo.html